"""
对于Linux、Windows操作系统，
都是先open文件，得到文件描述符，
再通过文件描述符进行read、write操作
最后close关闭文件
注意：一个进程打开文件数是有上限的，所以对于不再使用的文件，要及时关闭
"""


def open_r():
    """
    r:以 只读 方式打开文件。  文件默认打开方式
      文件的指针在文件的开头。
      若文件不存在，抛出异常
    """
    try:
        fd = open("file1.txt", mode="r", encoding="utf8")
        text = fd.read()  # read方法一次性 读入并返回 文件的 所有内容
        print(text)
        fd.close()
    except Exception as e:
        print(e)
        # 异常：
        # [Errno 2] No such file or directory: 'file1.txt'


def open_rw():
    """
    r+:以 读写 方式打开文件。
       文件的指针在文件的开头。
       若文件不存在，抛出异常
       写入位置从文件光标开始
       例如：若文件在write前就read了，此时光标在文件尾，从尾部添加新内容
            若文件直接write，此时光标在文件的开头，从文件头开始覆盖
    """
    try:
        fd = open("file2.txt", mode="r+", encoding="utf8")
        # text = fd.read()  # 读出来都是字符串
        # print(text)
        fd.write(" open_rw addition")
        fd.close()
    except Exception as e:
        print(e)
        # 异常：
        # [Errno 2] No such file or directory: 'file2.txt'


def open_w():
    """
    w:以 读写 方式打开文件。
      如果文件存在会被覆盖。
      如果文件不存在，创建新文件
    """
    fd = open("file3.txt", mode="w", encoding="utf8")
    # 无读权限，read时抛出异常
    # text=fd.read()
    # print(text)
    my_str = "helloworld"
    fd.write(my_str)
    fd.close()


def open_a():
    """
    a:以 追加 方式打开文件。
      若该文件已存在，文件指针将会放在文件的结尾。
      若文件不存在，创建新文件进行写入
    """
    fd = open("file4.txt", mode="a", encoding="utf8")
    fd.write("you")
    fd.close()


def usr_readline():
    """
    readline方法类似于C中的fgets
    """
    # 打开文件
    fd = open("file5.txt", encoding="utf8")

    while True:
        # 读取一行内容
        my_str = fd.readline()
        # 判断是否读到内容,读取到文件末尾拿到的是一个空字符串
        if not my_str:
            break

        # readline方法类似于C中的fgets，一次读一行，包括末尾的'\n'
        # 因为print默认会打印'\n'，所以使用 end="" 来避免打印两次'\n'
        print(my_str, end="")
    # 关闭文件
    fd.close()


def copy_file():
    fd1 = open("file_read.txt", encoding="utf8")
    fd2 = open("file_write.txt", mode="w", encoding="utf8")

    while True:
        my_str = fd1.readline()

        if len(my_str) == 0:
            break

        fd2.write(my_str)

    fd1.close()
    fd2.close()


if __name__ == '__main__':
    # open_r()
    # open_rw()
    # open_w()
    # open_a()
    # usr_readline()
    copy_file()
